#include <stdio.h>

#define BUFSIZE    1024 //定义一个宏 BUFSIZE，其值为 1024。
static char buf[BUFSIZE];//定义一个静态字符数组 buf

/* *
 * readline - get a line from stdin 从标准输入获取一行
 * @prompt:        the string to be written to stdout 要写入标准输出的字符串
 *
 * The readline() function will write the input string @prompt to
 * stdout first. If the @prompt is NULL or the empty string,
 * no prompt is issued.
 * （readline() 函数会首先将输入字符串 @prompt 写入
 * 标准输出。如果 @prompt 为 NULL 或空字符串，
 * 则不会发出提示。）
 *
 * This function will keep on reading characters and saving them to buffer
 * 'buf' until '\n' or '\r' is encountered.
 * 该函数将持续读取字符并将其保存到缓冲区buf'，直到遇到 '\n' 或 '\r'。
 *
 * Note that, if the length of string that will be read is longer than
 * buffer size, the end of string will be discarded.
 *请注意，如果要读取的字符串长度超过缓冲区大小，则字符串的末尾部分将被丢弃。
 * The readline() function returns the text of the line read. If some errors
 * are happened, NULL is returned. The return value is a global variable,
 * thus it should be copied before it is used.
 * readline() 函数返回读取的行文本。如果发生错误，则返回 NULL。返回值是一个全局变量，因此在使用之前应进行复制。
 * */
char *
readline(const char *prompt) {
    if (prompt != NULL) {
        cprintf("%s", prompt);
    }//检查 prompt 是否为 NULL，使用 cprintf 打印提示信息到标准输出
    int i = 0, c;//用于跟踪当前缓冲区中字符的数量，c用于存储从标准输入读取的字符
    while (1) {
        c = getchar();
        if (c < 0) {
            return NULL;
        }//检查 getchar 的返回值是否小于 0
        else if (c >= ' ' && i < BUFSIZE - 1) {//检查 c 是否为可打印字符且当前缓冲区未满。
            cputchar(c);
            buf[i ++] = c;
        }//使用 cputchar 输出当前字符 c 到标准输出，并将其存储在 buf 数组中的位置 i，然后递增 i。
        else if (c == '\b' && i > 0) { //检查字符是否为退格符 \b 并且当前缓冲区中已有字符，以便处理退格。
            cputchar(c);
            i --;
        }//输出退格符 c，并将 i 减 1，这样就从缓冲区中“删除”了最后一个字符。
        else if (c == '\n' || c == '\r') {
            cputchar(c);
            buf[i] = '\0';
            return buf;
        }//检查字符是否为换行符 \n 或回车符 \r，这两个符号都表示输入的结束。
    }    //输出换行符或回车符，然后在缓冲区的当前位置存储空字符 \0，以表示字符串的结束。最后返回 buf，即用户输入的字符串。
}

